package com.codejiwei.core.graphx

import org.apache.spark.graphx.util.GraphGenerators
import org.apache.spark.storage.StorageLevel
import org.apache.spark.{SparkConf, SparkContext}

object GraphX_CacheFunction {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("GraphXCacheFunctions")
    val sc = new SparkContext(conf)

    // 生成图，其中有 100 个节点，边的分区数为 2，对数正态分布的均值为 2.0，标准差为 1.5
    val graph = GraphGenerators.logNormalGraph(sc, numVertices = 10, numEParts = 2, mu = 2.0, sigma = 1.5)

    //TODO 将图的数据持久化到内存或磁盘上，以便在后续的操作中可以更快地访问数据，避免重复计算
    //默认持久到内存中
    val persistedGraph = graph.persist()
//    graph.persist(StorageLevel.MEMORY_AND_DISK)

    //TODO 将图的数据缓存到内存中，以便在后续的操作中可以更快地访问数据，避免重复计算
    //cache 方法默认将数据存储在内存中，并且不允许设置持久化级别
    val cachedGraph = graph.cache()

    // 对持久化后的图执行一些操作，例如计算度数
    val degrees = persistedGraph.degrees.collect()
    println(degrees.mkString(", "))

    //TODO 取消持久化图的顶点属性，即从缓存中移除顶点属性的数据。这可以用于释放内存空间，以及在不需要再次使用顶点属性数据时清除缓存
    val unpersistedGraph = graph.unpersistVertices()
    println(unpersistedGraph.numVertices)
  }
}
